<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/bug.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/bug.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="Maybe">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX0JVR19IXzA_"><span class="b">_LINUX_BUG_H</span></a>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX0JVR19IXzA_"><span class="b">_LINUX_BUG_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> 
<a name="4" /><span class="Maybe">       4:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">bug</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="5" /><span class="Maybe">       5:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">compiler</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="6" /><span class="Maybe">       6:</span> 
<a name="7" /><span class="Maybe">       7:</span> <span class="m">enum</span> <span class="b">bug_trap_type</span> <span class="f">{</span>
<a name="8" /><span class="Maybe">       8:</span>     <span class="b">BUG_TRAP_TYPE_NONE</span> <span class="f">=</span> <span class="c">0</span><span class="f">,</span>
<a name="9" /><span class="Maybe">       9:</span>     <span class="b">BUG_TRAP_TYPE_WARN</span> <span class="f">=</span> <span class="c">1</span><span class="f">,</span>
<a name="10" /><span class="Maybe">      10:</span>     <span class="b">BUG_TRAP_TYPE_BUG</span> <span class="f">=</span> <span class="c">2</span><span class="f">,</span>
<a name="11" /><span class="Maybe">      11:</span> <span class="f">}</span><span class="f">;</span>
<a name="12" /><span class="Maybe">      12:</span> 
<a name="13" /><span class="Maybe">      13:</span> <span class="m">struct</span> <span class="b">pt_regs</span><span class="f">;</span>
<a name="14" /><span class="Maybe">      14:</span> 
<a name="15" /><span class="False">      15:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__CHECKER__</span>
<a name="16" /><span class="False">      16:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yXzA_"><span class="b">BUILD_BUG_ON_NOT_POWER_OF_2</span></a><span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="17" /><span class="False">      17:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QlVJTERfQlVHX09OX1pFUk9fMA__"><span class="b">BUILD_BUG_ON_ZERO</span></a><span class="f">(</span><span class="b">e</span><span class="f">)</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="18" /><span class="False">      18:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QlVJTERfQlVHX09OX05VTExfMA__"><span class="b">BUILD_BUG_ON_NULL</span></a><span class="f">(</span><span class="b">e</span><span class="f">)</span> <span class="f">(</span><span class="f">(</span><span class="m">void</span><span class="f">*</span><span class="f">)</span><span class="c">0</span><span class="f">)</span>
<a name="19" /><span class="False">      19:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_QlVJTERfQlVHX09OX0lOVkFMSURfMA__"><span class="b">BUILD_BUG_ON_INVALID</span></a><span class="f">(</span><span class="b">e</span><span class="f">)</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="20" /><span class="False">      20:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QlVJTERfQlVHX09OX01TR18w"><span class="b">BUILD_BUG_ON_MSG</span></a><span class="f">(</span><span class="b">cond</span><span class="f">,</span> <span class="b">msg</span><span class="f">)</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="21" /><span class="False">      21:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_QlVJTERfQlVHX09OXzA_"><span class="b">BUILD_BUG_ON</span></a><span class="f">(</span><span class="b">condition</span><span class="f">)</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="22" /><span class="False">      22:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QlVJTERfQlVHXzA_"><span class="b">BUILD_BUG</span></a><span class="f">(</span><span class="f">)</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="f">#</span><span class="n">else</span> <span class="k">/* __CHECKER__ */</span>
<a name="24" /><span class="Maybe">      24:</span> 
<a name="25" /><span class="Maybe">      25:</span> <span class="k">/* Force a compilation error if a constant expression is not a power of 2 */</span>
<a name="26" /><span class="Maybe">      26:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yXzA_"><span class="b">BUILD_BUG_ON_NOT_POWER_OF_2</span></a><span class="f">(</span><span class="b">n</span><span class="f">)</span>            \
<a name="27" /><span class="Maybe">      27:</span>     <a href="cpu.c_macros_ref.html#_QlVJTERfQlVHX09OXzA_"><span class="b">BUILD_BUG_ON</span></a><span class="f">(</span><span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">==</span> <span class="c">0</span> <span class="f">||</span> <span class="f">(</span><span class="f">(</span><span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">-</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span> <span class="f">!=</span> <span class="c">0</span><span class="f">)</span><span class="f">)</span>
<a name="28" /><span class="Maybe">      28:</span> 
<a name="29" /><span class="Maybe">      29:</span> <span class="k">/* Force a compilation error if condition is true, but also produce a</span>
<a name="30" /><span class="Maybe">      30:</span> <span class="k">   result (of value 0 and type size_t), so the expression can be used</span>
<a name="31" /><span class="Maybe">      31:</span> <span class="k">   e.g. in a structure initializer (or where-ever else comma expressions</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="k">   aren&apos;t permitted). */</span>
<a name="33" /><span class="Maybe">      33:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QlVJTERfQlVHX09OX1pFUk9fMA__"><span class="b">BUILD_BUG_ON_ZERO</span></a><span class="f">(</span><span class="b">e</span><span class="f">)</span> <span class="f">(</span><span class="m">sizeof</span><span class="f">(</span><span class="m">struct</span> <span class="f">{</span> <span class="m">int</span><span class="f">:</span><span class="f">-</span><span class="f">!</span><span class="f">!</span><span class="f">(</span><span class="b">e</span><span class="f">)</span><span class="f">;</span> <span class="f">}</span><span class="f">)</span><span class="f">)</span>
<a name="34" /><span class="Maybe">      34:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QlVJTERfQlVHX09OX05VTExfMA__"><span class="b">BUILD_BUG_ON_NULL</span></a><span class="f">(</span><span class="b">e</span><span class="f">)</span> <span class="f">(</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="m">sizeof</span><span class="f">(</span><span class="m">struct</span> <span class="f">{</span> <span class="m">int</span><span class="f">:</span><span class="f">-</span><span class="f">!</span><span class="f">!</span><span class="f">(</span><span class="b">e</span><span class="f">)</span><span class="f">;</span> <span class="f">}</span><span class="f">)</span><span class="f">)</span>
<a name="35" /><span class="Maybe">      35:</span> 
<a name="36" /><span class="Maybe">      36:</span> <span class="k">/*</span>
<a name="37" /><span class="Maybe">      37:</span> <span class="k"> * BUILD_BUG_ON_INVALID() permits the compiler to check the validity of the</span>
<a name="38" /><span class="Maybe">      38:</span> <span class="k"> * expression but avoids the generation of any code, even if that expression</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="k"> * has side-effects.</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="k"> */</span>
<a name="41" /><span class="Maybe">      41:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_QlVJTERfQlVHX09OX0lOVkFMSURfMA__"><span class="b">BUILD_BUG_ON_INVALID</span></a><span class="f">(</span><span class="b">e</span><span class="f">)</span> <span class="f">(</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">(</span><span class="m">sizeof</span><span class="f">(</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_X19mb3JjZV8w"><span class="b">__force</span></a> <span class="m">long</span><span class="f">)</span><span class="f">(</span><span class="b">e</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="42" /><span class="Maybe">      42:</span> 
<a name="43" /><span class="Maybe">      43:</span> <span class="k">/**</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="k"> * BUILD_BUG_ON_MSG - break compile if a condition is true &amp; emit supplied</span>
<a name="45" /><span class="Maybe">      45:</span> <span class="k"> *              error message.</span>
<a name="46" /><span class="Maybe">      46:</span> <span class="k"> * @condition: the condition which the compiler should know is false.</span>
<a name="47" /><span class="Maybe">      47:</span> <span class="k"> *</span>
<a name="48" /><span class="Maybe">      48:</span> <span class="k"> * See BUILD_BUG_ON for description.</span>
<a name="49" /><span class="Maybe">      49:</span> <span class="k"> */</span>
<a name="50" /><span class="Maybe">      50:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QlVJTERfQlVHX09OX01TR18w"><span class="b">BUILD_BUG_ON_MSG</span></a><span class="f">(</span><span class="b">cond</span><span class="f">,</span> <span class="b">msg</span><span class="f">)</span> <a href="cpu.c_macros_noref.html#_Y29tcGlsZXRpbWVfYXNzZXJ0XzA_"><span class="b">compiletime_assert</span></a><span class="f">(</span><span class="f">!</span><span class="f">(</span><span class="b">cond</span><span class="f">)</span><span class="f">,</span> <span class="b">msg</span><span class="f">)</span>
<a name="51" /><span class="Maybe">      51:</span> 
<a name="52" /><span class="Maybe">      52:</span> <span class="k">/**</span>
<a name="53" /><span class="Maybe">      53:</span> <span class="k"> * BUILD_BUG_ON - break compile if a condition is true.</span>
<a name="54" /><span class="Maybe">      54:</span> <span class="k"> * @condition: the condition which the compiler should know is false.</span>
<a name="55" /><span class="Maybe">      55:</span> <span class="k"> *</span>
<a name="56" /><span class="Maybe">      56:</span> <span class="k"> * If you have some code which relies on certain constants being equal, or</span>
<a name="57" /><span class="Maybe">      57:</span> <span class="k"> * some other compile-time-evaluated condition, you should use BUILD_BUG_ON to</span>
<a name="58" /><span class="Maybe">      58:</span> <span class="k"> * detect if someone changes it.</span>
<a name="59" /><span class="Maybe">      59:</span> <span class="k"> *</span>
<a name="60" /><span class="Maybe">      60:</span> <span class="k"> * The implementation uses gcc&apos;s reluctance to create a negative array, but gcc</span>
<a name="61" /><span class="Maybe">      61:</span> <span class="k"> * (as of 4.4) only emits that error for obvious cases (e.g. not arguments to</span>
<a name="62" /><span class="Maybe">      62:</span> <span class="k"> * inline functions).  Luckily, in 4.3 they added the &quot;error&quot; function</span>
<a name="63" /><span class="Maybe">      63:</span> <span class="k"> * attribute just for this type of case.  Thus, we use a negative sized array</span>
<a name="64" /><span class="Maybe">      64:</span> <span class="k"> * (should always create an error on gcc versions older than 4.4) and then call</span>
<a name="65" /><span class="Maybe">      65:</span> <span class="k"> * an undefined function with the error attribute (should always create an</span>
<a name="66" /><span class="Maybe">      66:</span> <span class="k"> * error on gcc 4.3 and later).  If for some reason, neither creates a</span>
<a name="67" /><span class="Maybe">      67:</span> <span class="k"> * compile-time error, we&apos;ll still have a link-time error, which is harder to</span>
<a name="68" /><span class="Maybe">      68:</span> <span class="k"> * track down.</span>
<a name="69" /><span class="Maybe">      69:</span> <span class="k"> */</span>
<a name="70" /><span class="Maybe">      70:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">__OPTIMIZE__</span>
<a name="71" /><span class="Maybe">      71:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_QlVJTERfQlVHX09OXzA_"><span class="b">BUILD_BUG_ON</span></a><span class="f">(</span><span class="b">condition</span><span class="f">)</span> <span class="f">(</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="m">sizeof</span><span class="f">(</span><span class="m">char</span><span class="f">[</span><span class="c">1</span> <span class="f">-</span> <span class="c">2</span><span class="f">*</span><span class="f">!</span><span class="f">!</span><span class="f">(</span><span class="b">condition</span><span class="f">)</span><span class="f">]</span><span class="f">)</span><span class="f">)</span>
<a name="72" /><span class="False">      72:</span> <span class="f">#</span><span class="n">else</span>
<a name="73" /><span class="False">      73:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_QlVJTERfQlVHX09OXzA_"><span class="b">BUILD_BUG_ON</span></a><span class="f">(</span><span class="b">condition</span><span class="f">)</span> \
<a name="74" /><span class="False">      74:</span>     <a href="cpu.c_macros_noref.html#_QlVJTERfQlVHX09OX01TR18w"><span class="b">BUILD_BUG_ON_MSG</span></a><span class="f">(</span><span class="b">condition</span><span class="f">,</span> <span class="e">&quot;BUILD_BUG_ON failed: &quot;</span> <span class="f">#</span><span class="b">condition</span><span class="f">)</span>
<a name="75" /><span class="Maybe">      75:</span> <span class="f">#</span><span class="n">endif</span>
<a name="76" /><span class="Maybe">      76:</span> 
<a name="77" /><span class="Maybe">      77:</span> <span class="k">/**</span>
<a name="78" /><span class="Maybe">      78:</span> <span class="k"> * BUILD_BUG - break compile if used.</span>
<a name="79" /><span class="Maybe">      79:</span> <span class="k"> *</span>
<a name="80" /><span class="Maybe">      80:</span> <span class="k"> * If you have some code that you expect the compiler to eliminate at</span>
<a name="81" /><span class="Maybe">      81:</span> <span class="k"> * build time, you should use BUILD_BUG to detect if it is</span>
<a name="82" /><span class="Maybe">      82:</span> <span class="k"> * unexpectedly used.</span>
<a name="83" /><span class="Maybe">      83:</span> <span class="k"> */</span>
<a name="84" /><span class="Maybe">      84:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QlVJTERfQlVHXzA_"><span class="b">BUILD_BUG</span></a><span class="f">(</span><span class="f">)</span> <a href="cpu.c_macros_noref.html#_QlVJTERfQlVHX09OX01TR18w"><span class="b">BUILD_BUG_ON_MSG</span></a><span class="f">(</span><span class="c">1</span><span class="f">,</span> <span class="e">&quot;BUILD_BUG failed&quot;</span><span class="f">)</span>
<a name="85" /><span class="Maybe">      85:</span> 
<a name="86" /><span class="Maybe">      86:</span> <span class="f">#</span><span class="n">endif</span>    <span class="k">/* __CHECKER__ */</span>
<a name="87" /><span class="Maybe">      87:</span> 
<a name="88" /><span class="Maybe">      88:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX0dFTkVSSUNfQlVHXzA_"><span class="b">CONFIG_GENERIC_BUG</span></a>
<a name="89" /><span class="Maybe">      89:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">-</span><span class="b">generic</span><span class="f">/</span><span class="b">bug</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="90" /><span class="Maybe">      90:</span> 
<a name="91" /><span class="Maybe">      91:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">is_warning_bug</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">bug_entry</span> <span class="f">*</span><span class="b">bug</span><span class="f">)</span>
<a name="92" /><span class="Maybe">      92:</span> <span class="f">{</span>
<a name="93" /><span class="Maybe">      93:</span>     <span class="m">return</span> <span class="b">bug</span><span class="f">-&gt;</span><span class="b">flags</span> <span class="f">&amp;</span> <a href="cpu.c_macros_ref.html#_QlVHRkxBR19XQVJOSU5HXzA_"><span class="b">BUGFLAG_WARNING</span></a><span class="f">;</span>
<a name="94" /><span class="Maybe">      94:</span> <span class="f">}</span>
<a name="95" /><span class="Maybe">      95:</span> 
<a name="96" /><span class="Maybe">      96:</span> <span class="m">const</span> <span class="m">struct</span> <span class="b">bug_entry</span> <span class="f">*</span><span class="b">find_bug</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">bugaddr</span><span class="f">)</span><span class="f">;</span>
<a name="97" /><span class="Maybe">      97:</span> 
<a name="98" /><span class="Maybe">      98:</span> <span class="m">enum</span> <span class="b">bug_trap_type</span> <span class="b">report_bug</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">bug_addr</span><span class="f">,</span> <span class="m">struct</span> <span class="b">pt_regs</span> <span class="f">*</span><span class="b">regs</span><span class="f">)</span><span class="f">;</span>
<a name="99" /><span class="Maybe">      99:</span> 
<a name="100" /><span class="Maybe">     100:</span> <span class="k">/* These are defined by the architecture */</span>
<a name="101" /><span class="Maybe">     101:</span> <span class="m">int</span> <span class="b">is_valid_bugaddr</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">addr</span><span class="f">)</span><span class="f">;</span>
<a name="102" /><span class="Maybe">     102:</span> 
<a name="103" /><span class="False">     103:</span> <span class="f">#</span><span class="n">else</span>    <span class="k">/* !CONFIG_GENERIC_BUG */</span>
<a name="104" /><span class="False">     104:</span> 
<a name="105" /><span class="False">     105:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">enum</span> <span class="b">bug_trap_type</span> <span class="b">report_bug</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">bug_addr</span><span class="f">,</span>
<a name="106" /><span class="False">     106:</span>                         <span class="m">struct</span> <span class="b">pt_regs</span> <span class="f">*</span><span class="b">regs</span><span class="f">)</span>
<a name="107" /><span class="False">     107:</span> <span class="f">{</span>
<a name="108" /><span class="False">     108:</span>     <span class="m">return</span> <span class="b">BUG_TRAP_TYPE_BUG</span><span class="f">;</span>
<a name="109" /><span class="False">     109:</span> <span class="f">}</span>
<a name="110" /><span class="False">     110:</span> 
<a name="111" /><span class="Maybe">     111:</span> <span class="f">#</span><span class="n">endif</span>    <span class="k">/* CONFIG_GENERIC_BUG */</span>
<a name="112" /><span class="True">     112:</span> <span class="f">#</span><span class="n">endif</span>    <span class="k">/* _LINUX_BUG_H */</span>
<a name="113" /><span class="True">     113:</span> </pre>
  </body>
</html>
